package com.by.service.impl;

import cn.hutool.core.map.MapUtil;
import com.by.bean.Product;
import com.by.common.bean.PageBean;
import com.by.common.crud.BaseServiceImpl;
import com.by.common.utils.AssertUtils;
import com.by.mapper.ProductBannerMapper;
import com.by.mapper.ProductMapper;
import com.by.service.ProductService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author Ye QS
 * @version 0.1
 * @className ProductServiceImpl
 * @description
 * @date 2024/9/14 19:34
 * @since jdk11
 */
@Service
public class ProductServiceImpl extends BaseServiceImpl<Product, ProductMapper> implements ProductService {
    @Autowired
    ProductMapper productMapper;
    @Autowired
    ProductBannerMapper productBannerMapper;

    @Autowired
    HttpServletRequest request;

    @Override
    public List<Product> queryAll() {
        return productMapper.queryAll();
    }

    /**
     * 保存产品信息及轮播图
     * 此方法主要负责保存产品实体以及其关联的轮播图信息
     *
     * @param entity 产品实体，包含产品详细信息及可能的轮播图信息
     * @return 返回影响的记录数，通常成功保存后返回1
     */
    @Transactional
    @Override
    public int save(Product entity) {
        // 保存产品实体信息
        int rs = super.save(entity);
        // 断言保存操作是否成功，若不成功抛出运行时异常
        AssertUtils.isNotSuccess(rs, "保存产品失败");

        // 若产品实体包含轮播图信息，则尝试保存轮播图
        if (null != entity.getBanner() && entity.getBanner().size() > 0) {
            // 保存指定产品的轮播图信息
            rs = productBannerMapper.save(entity.getId(), entity.getBanner());
            // 断言保存操作是否成功，若不成功抛出运行时异常
            AssertUtils.isNotSuccess(rs, "保存产品轮播图失败");
        }

        // 返回操作成功标识
        return 1;
    }

    /**
     * 更新产品信息，包括产品轮播图
     * 此方法首先尝试更新产品基本信息，如果更新成功，接着处理产品轮播图
     * 如果产品有关联的轮播图，先删除旧的轮播图信息，然后插入新的轮播图信息
     *
     * @param entity 待更新的产品对象，可能包含产品基本信息及关联的轮播图信息
     * @return 返回更新操作的成功标志，此处返回固定值1表示成功
     * @throws RuntimeException 如果产品信息更新失败或轮播图保存失败，将抛出运行时异常
     */
    @Transactional
    @Override
    public int update(Product entity) {
        // 更新产品基本信息
        int rs = super.update(entity);
        // 校验产品信息是否更新成功，如果失败则抛出异常
        AssertUtils.isNotSuccess(rs, "产品修改失败");

        // 删除该产品原有的轮播图信息
        productBannerMapper.deleteByProduct(entity.getId());
        // 如果该产品有关联的轮播图信息
        if (null != entity.getBanner() && entity.getBanner().size() > 0) {
            // 保存新的产品轮播图信息
            rs = productBannerMapper.save(entity.getId(), entity.getBanner());
            // 校验轮播图信息是否保存成功，如果失败则抛出异常
            AssertUtils.isNotSuccess(rs, "保存产品轮播图失败");
        }
        // 返回操作成功标志
        return 1;
    }

    @Override
    public int delete(Serializable id) {

        return super.delete(id);
    }

    /**
     * 删除指定路径的图片文件
     *
     * @param path 图片的相对路径
     */
    void rmpic(String path) {
        // 获取Web应用的根目录的绝对路径
        String root = request.getServletContext().getRealPath("/");
        // 根据根目录和相对路径创建File对象
        File file = new File(root + path);
        // 删除指定路径的文件
        file.delete();
    }
    @Override
    public PageBean queryCust(Map map) {
        int page = MapUtil.getInt(map, "page");
        int pageSize = MapUtil.getInt(map, "pageSize");
        //设置分页
        PageHelper.startPage(page, pageSize);// 后面紧跟查询
        List<Map> list = baseMapper.queryCust(map);

        //获取分页信息 将查询结果封装一下
        PageInfo info = new PageInfo(list);

        return new PageBean(page, pageSize, info.getTotal(), list);
    }
}
